package controller.pub;

import controller.MyCoolServlet;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;
import model.Product;
import model.User;
import persistence.product.ProductDAO;
import persistence.product.ProductPersistFactory;

public class CreateServlet extends MyCoolServlet {

    @Override
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ProductDAO persistenceManager = ProductPersistFactory.getProductDAO(persistenceMechanism);
        Product product = generateProductFromRequest(request);
        String errorString = validarCampos(product);

        if (errorString.equals("") && product != null && persistenceManager.createProduct(product)) {
            request.setAttribute("product", product);
            request.setAttribute("message", "App incluida en la tienda");
            gotoURL(successForm, request, response);
        } else {
            if (!errorString.equals("")){
                request.setAttribute("message1", "Error al validar");
                request.setAttribute("message2", errorString);
            }
            else{
                request.setAttribute("message1", "Error al crear el producto:");
                request.setAttribute("message2", "Es posible que dicha app ya exista");
            }
            gotoURL(errorForm, request, response);
        }
    }

    Product generateProductFromRequest(HttpServletRequest request) throws NumberFormatException {
        Product product = new Product();
        String nombre = (String) request.getAttribute("nombre");
        String precioString, descripcionc, descripcionl, so;
        int ventas;

        ventas = 0;
        nombre = (String) request.getAttribute("nombre");
        precioString = (String) request.getAttribute("precio");
        descripcionc = (String) request.getAttribute("descripcionc");
        descripcionl = (String) request.getAttribute("descripcionl");
        so = (String) request.getAttribute("so");

        String fecha = getFechaActual();
        HttpSession s = request.getSession();
        String usuario = ((User) s.getAttribute("usuario")).getUsuario();
        if (usuario == null)
            usuario = "Anónimo";
        product.setId(precioString);
        product.setNombre(nombre);
        product.setDescripcionc(descripcionc);
        product.setDescripcionl(descripcionl);
        product.setSo(so);
        product.setVentas(ventas);
        product.setFecha(fecha);
        product.setUsuario(usuario);


        return product;
    }

    public String validarCampos(Product product) {
        String errorString = "";

        if (!validarNombre(product.getNombre())) {
            errorString += "Nombre; ";
        }
        if (!validarPrecio(product.getId())) {
            errorString += "Precio; ";
        } else {
            Float precio = Float.parseFloat(product.getId());
            product.setPrecio(precio);
        }
        if (!validarDescripcionc(product.getDescripcionc())) {
            errorString += "Descripcion Corta; ";
        }
        if (!validarDescripcionl(product.getDescripcionl())) {
            errorString += "Descripcion Larga; ";
        }
        if (errorString.equals("")) {
            product.setId(product.getNombre() + "_" + product.getSo());
            return errorString;
        } else {
            return "Parametros incorrectos: " + errorString.substring(0, errorString.length()-2);
        }
    }

    private boolean validarNombre(String nombre) {
        boolean isGoodLength = checkLength(nombre, 1, 50);
        return nombre.matches("([a-zA-Z0-9ñÑáéíóúÁÉÍÓÚ ])*") && isGoodLength;
    }

    private boolean validarPrecio(String precio) {
        boolean isGoodLength = checkLength(precio, 1, 10);
        return (precio.matches("([0-9])*.([0-9])*") || precio.matches("([0-9])*")) && isGoodLength;
    }

    private boolean validarDescripcionc(String descripcionc) {
        boolean isGoodLength = checkLength(descripcionc, 1, 140);
        return (!descripcionc.contains("<") && !descripcionc.contains(">")) && isGoodLength;
    }

    private boolean validarDescripcionl(String descripcionl) {
        boolean isGoodLength = checkLength(descripcionl, 1, 750);
        return (!descripcionl.contains("<") && !descripcionl.contains(">")) && isGoodLength;
    }

    private boolean checkLength(String data, int minAceptable, int maxAceptable) {
        int length = data.length();
        boolean isGoodLength = length >= minAceptable && length <= maxAceptable;
        return isGoodLength;
    }

    private static String getFechaActual() {
        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat("dd-MM-yyyy");
        return formateador.format(ahora);
    }
}
